home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / pack / xpk_Source.lha / xpk_Source / xpkmaster / debug.c < prev    next >
C/C++ Source or Header  |  1998-11-18  |  7KB  |  209 lines

  1. #ifndef XPKMASTER_DEBUG_C
  2. #define XPKMASTER_DEBUG_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        debug.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: debug.c 1.9 (18.11.1998)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    the debug stuff
  12.  
  13.  1.0   05.10.96 : first real version
  14.  1.1   20.10.96 : added the external debug modes
  15.  1.2   21.10.96 : changed debug totally
  16.  1.3   01.01.97 : changed output a bit - "XpkM before stuff - find in lots
  17.      of other debuf stuff"
  18.  1.4   09.03.97 : output contained 0 byte - removed
  19.  1.5   01.04.97 : little changes
  20.  1.6   12.04.97 : added TagList output, therefor changed XPKDEBUG contents
  21.  1.7   21.02.98 : uses new style register definition
  22.  1.8   25.06.98 : now uses SDI_compiler.h
  23.  1.9   18.11.98 : new style tag output copied from xadmaster.library
  24. */
  25.  
  26. #include <exec/types.h>
  27. #include <proto/exec.h>
  28. #include <proto/dos.h>
  29. #include <proto/utility.h>
  30. #include <utility/tagitem.h>
  31. #include <dos/var.h>
  32. #include <xpk/xpk.h>
  33. #include "xpkmaster.h"
  34. #include "SDI_compiler.h"
  35.  
  36. typedef void (*putchtype) ();
  37.  
  38. #define FLAG_ERROR    (1<<0)
  39. #define FLAG_RUNTIME    (1<<1)
  40. #define FLAG_TAGLIST    (1<<2)
  41.  
  42. extern LONG STDARGS KPutChar(LONG);
  43. extern LONG STDARGS DPutChar(LONG);
  44. extern void DoDebug(UBYTE mode, STRPTR fmt, APTR data);
  45.  
  46. static ASM(void) serfunc(REG(d0, UBYTE c), REG(a3, ULONG pd))
  47. { if(c) KPutChar(c); }
  48.  
  49. static ASM(void) parfunc(REG(d0, UBYTE c), REG(a3, ULONG pd))
  50. { if(c) DPutChar(c); }
  51.  
  52. static ASM(void) normfunc(REG(d0, UBYTE c), REG(a3, ULONG pd))
  53. {
  54.   UBYTE d = c;
  55.   if(c)
  56.     Write(pd, &d, 1);
  57. }
  58.  
  59. void DebugTagList(STRPTR fmt, struct TagItem *taglist)
  60. {
  61.   DoDebug(FLAG_TAGLIST, fmt, taglist);
  62. }
  63.  
  64. void DebugError(STRPTR format, ...)
  65. {
  66.   DoDebug(FLAG_RUNTIME, format, (APTR)((ULONG)(&format)+sizeof(STRPTR)));
  67. }
  68.  
  69. void DebugRunTime(STRPTR format, ...)
  70. {
  71.   DoDebug(FLAG_ERROR, format, (APTR)((ULONG)(&format)+sizeof(STRPTR)));
  72. }
  73.  
  74. void DoDebug(UBYTE mode, STRPTR fmt, APTR data)
  75. {
  76.   ULONG fh = 0, i, Flags = 0;
  77.   UBYTE Mode[5] = "";
  78.   ASM(void) (*function)(REG(d0, UBYTE), REG(a3, ULONG)) = 0;
  79.  
  80.   Forbid();
  81.  
  82.   GetVar("XPKDEBUG", (STRPTR) &Mode, 5, GVF_GLOBAL_ONLY);
  83.  
  84.   for(i=1; Mode[i] && i < 5; ++i)
  85.   {
  86.     switch(Mode[i])
  87.     {
  88.       case 'E': Flags |= FLAG_ERROR; break;
  89.       case 'R': Flags |= FLAG_RUNTIME; break;
  90.       case 'T': Flags |= FLAG_TAGLIST; break;
  91.     }
  92.   }
  93.  
  94.   mode &= Flags;
  95.  
  96.   if(mode)
  97.   {
  98.     switch(Mode[0])
  99.     {
  100.     case 'S': function = serfunc; break;
  101.     case 'P': function = parfunc; break;
  102.     case 'F':
  103.       if((fh = Open("T:XpkMasterOut", MODE_READWRITE)))
  104.       {
  105.         Seek(fh, 0, OFFSET_END);
  106.         function = normfunc;
  107.       }
  108.       break;
  109.     }
  110.     if(function)
  111.     {
  112.       i = (ULONG) FindTask(0);
  113.       RawDoFmt("XpkM(%08lx):", &i, (putchtype) function, (APTR) fh);
  114.  
  115.       RawDoFmt(fmt, data, (putchtype) function, (APTR) fh);
  116.       RawDoFmt("\n", 0, (putchtype) function, (APTR) fh);
  117.  
  118.       if(mode & FLAG_TAGLIST)
  119.       {
  120.         struct TagItem *ti;
  121.         while((ti = NextTagItem((struct TagItem **) &data)))
  122.         {
  123.           ULONG i[2], dmode = 0;
  124.           STRPTR s;
  125.           
  126.           /* dmode == 1 - BOOL data, dmode == 2 - unknown */
  127.       switch(ti->ti_Tag)
  128.       {
  129.       case XPK_InName:      s = "XPK_InName, \"%s\" ($%08lx)"; break;
  130.       case XPK_InFH:      s = "XPK_InFH, $%08lx"; break;
  131.       case XPK_InBuf:      s = "XPK_InBuf, $%08lx"; break;
  132.       case XPK_InHook:      s = "XPK_InHook, $%08lx"; break;
  133.       case XPK_OutName:      s = "XPK_OutName, \"%s\" ($%08lx)"; break;
  134.       case XPK_OutFH:      s = "XPK_OutFH, %08lx"; break;
  135.       case XPK_OutBuf:      s = "XPK_OutBuf, $%08lx"; break;
  136.       case XPK_GetOutBuf:      s = "XPK_GetOutBuf, $%08lx"; break;
  137.       case XPK_OutHook:      s = "XPK_OutHook, $%08lx"; break;
  138.       case XPK_InLen:      s = "XPK_InLen, %lu"; break;
  139.       case XPK_OutBufLen:      s = "XPK_OutBufLen, %lu"; break;
  140.       case XPK_GetOutLen:      s = "XPK_GetOutLen, $%08lx"; break;
  141.       case XPK_GetOutBufLen:  s = "XPK_GetOutBufLen, $%08lx"; break;
  142.       case XPK_Password:      s = "XPK_Password, \"%s\" ($%08lx)"; break;
  143.       case XPK_GetError:      s = "XPK_GetError, $%08lx"; break;
  144.       case XPK_OutMemType:      s = "XPK_OutMemType, $%08lx"; break;
  145.       case XPK_PassThru:      s = "XPK_PassThru, %s"; dmode = 1; break;
  146.       case XPK_StepDown:      s = "XPK_StepDown, %s"; dmode = 1; break;
  147.       case XPK_ChunkHook:      s = "XPK_ChunkHook, $%08ld"; break;
  148.       case XPK_PackMethod:      s = "XPK_PackMethod, \"%s\" ($%08lx)"; break;
  149.       case XPK_ChunkSize:      s = "XPK_ChunkSize, %lu"; break;
  150.       case XPK_PackMode:      s = "XPK_PackMode, %lu"; break;
  151.       case XPK_NoClobber:      s = "XPK_NoClobber, %s"; dmode = 1; break;
  152.       case XPK_Ignore:      s = "XPK_Ignore"; break;
  153.       case XPK_TaskPri:      s = "XPK_TaskPri, $ld"; break;
  154.       case XPK_FileName:      s = "XPK_FileName, \"%s\" ($%08lx)"; break;
  155.       case XPK_ShortError:      s = "XPK_ShortError, %s"; dmode = 1; break;
  156.       case XPK_PackersQuery:  s = "XPK_PackersQuery, $%08lx"; break;
  157.       case XPK_PackerQuery:      s = "XPK_PackerQuery, $%08lx"; break;
  158.       case XPK_ModeQuery:     s = "XPK_ModeQuery, $%08lx"; break;
  159.       case XPK_LossyOK:      s = "XPK_LossyOK, %s"; dmode = 1; break;
  160.       case XPK_NoCRC:      s = "XPK_NoCRC, $%08lx"; break;
  161.       case XPK_Key16:      s = "XPK_Key32, $%04lx"; break;
  162.       case XPK_Key32:      s = "XPK_Key32, $%08lx"; break;
  163.       case XPK_NeedSeek:      s = "XPK_NeedSeek, %s"; dmode = 1; break;
  164.           case XPK_UseXfdMaster:  s = "XPK_UseXfdMaster, %s"; dmode = 1; break;
  165.           case XPK_UseExternals:  s = "XPK_UseExternals, %s"; dmode = 1; break;
  166.           case XPK_PassRequest:   s = "XPK_PassRequest, %s"; dmode = 1; break;
  167.       case XPK_Preferences:      s = "XPK_Preferences, %s"; dmode = 1; break;
  168.       case XPK_ChunkReport:      s = "XPK_ChunkReport, %s"; dmode = 1; break;
  169.       case XPK_PassChars:      s = "XPK_PassChars, $%08lx"; break;
  170.       case XPK_PasswordBuf:   s = "XPK_PasswordBuf, $%08lx"; break;
  171.       case XPK_PassBufSize:      s = "XPK_PassBufSize, %lu"; break;
  172.       case XPK_Key16BitPtr:      s = "XPK_Key16BitPtr, $%08lx"; break;
  173.       case XPK_Key32BitPtr:      s = "XPK_Key32BitPtr, $%08lx"; break;
  174.       case XPK_PubScreen:      s = "XPK_PubScreen, $%08lx"; break;
  175.       case XPK_PassTitle:      s = "XPK_PassTitle, \"%s\" ($%08lx)"; break;
  176.       case XPK_TimeOut:      s = "XPK_TimeOut, %lu"; break;
  177.       case XPK_PassWinLeft:      s = "XPK_PassWinLeft, %lu"; break;
  178.       case XPK_PassWinTop:      s = "XPK_PassWinTop, %lu"; break;
  179.       case XPK_PassWinWidth:  s = "XPK_PassWinWidth, %lu"; break;
  180.       case XPK_PassWinHeight: s = "XPK_PassWinHeight, %lu"; break;
  181.       case XPK_PassCenter:      s = "XPK_PassCenter, %s"; dmode = 1; break;
  182.       case XPK_PassVerify:      s = "XPK_PassVerify, %s"; dmode = 1; break;
  183.       default:          s = "$%08lx, $%08lx"; dmode = 2; break;
  184.       }
  185.       if(dmode == 1)
  186.             i[0] = ti->ti_Data ? (ULONG) "TRUE" : (ULONG) "FALSE";
  187.           else if(dmode == 2)
  188.           {
  189.         i[0] = ti->ti_Tag; i[1] = ti->ti_Data;
  190.       }
  191.           else
  192.             i[0] = i[1] = ti->ti_Data;
  193.  
  194.           RawDoFmt("   ", 0, (putchtype) function, (APTR) fh);
  195.           RawDoFmt(s, i, (putchtype) function, (APTR) fh);
  196.           RawDoFmt("\n", 0, (putchtype) function, (APTR) fh);
  197.         }
  198.         RawDoFmt("   TAG_DONE\n", 0, (putchtype) function, (APTR) fh);
  199.       }
  200.     }
  201.  
  202.     if(fh)
  203.       Close(fh);
  204.   }
  205.  
  206.   Permit();
  207. }
  208.  
  209.